// Copyright(2011) ReportGear co., ltd.
/**
 * @fileOverview 业务基础开发平台-核心-HTML5兼容
 */
(function() {
	var toString = Object.prototype.toString;

	/**
	 * 判断对象是否为数组
	 */
	if (!Array.isArray) {
		Array.isArray = function(arg) {
			return toString.call(arg) === '[object Array]';
		}
	}

	/**
	 * 数组遍历
	 * 
	 * @param {Function} cb 回调函数
	 * @param {Object} context 上下文
	 */
	if (!Array.prototype.forEach) {
		Array.prototype.forEach = function(cb, context) {
			for ( var i = 0, len = this.length; i < len; i++) {
				if (i in this) {
					cb.call(context, this[i], i, this);
				}
			}
		}
	}

	/**
	 * 数组遍历，一个回调函数返回false就结束,并返回false
	 * 
	 * @return {Boolean}
	 */
	if (!Array.prototype.every) {
		Array.prototype.every = function(cb, context) {
			for ( var i = 0, len = this.length; i < len; i++) {
				if (i in this && !cb.call(context, this[i], i, this)) {
					return false;
				}
			}
			return true;
		}
	}

	/**
	 * 数组遍历，一个回调函数返回true就结束，并返回true
	 * 
	 * @return {Boolean}
	 */
	if (!Array.prototype.some) {
		Array.prototype.some = function(cb, context) {
			for ( var i = 0, len = this.length; i < len; i++) {
				if (i in this && cb.call(context, this[i], i, this)) {
					return true;
				}
			}
			return false;
		}
	}

	/**
	 * 数组map处理
	 * 
	 * @return {Array} 处理后的数组
	 */
	if (!Array.prototype.map) {
		Array.prototype.map = function(cb, context) {
			var res = [];
			for ( var i = 0, len = this.length; i < len; i++) {
				if (i in this) {
					res[i] = cb.call(context, this[i], i, this);
				}
			}
			return res;
		}
	}

	/**
	 * 数组过滤
	 * 
	 * @return {Array} 过滤后的数组
	 */
	if (!Array.prototype.filter) {
		Array.prototype.filter = function(cb, context) {
			var res = [];
			for ( var i = 0, len = this.length; i < len; i++) {
				if (i in this) {
					var val = this[i];
					if (cb.call(context, val, i, this)) {
						res.push(val);
					}
				}
			}
			return res;
		}
	}

	/**
	 * 递归,当前只能处理数字
	 */
	if (!Array.prototype.reduce) {
		Array.prototype.reduce = function(cb, init, context) {
			var i = 0, len = this.length, result;

			if (init) {
				result = init;
			} else {
				while (i < len) {
					if (i in this) {
						result = this[i++];
						break;
					} else {
						i++;
					}
				}
				if (i == len) {
					throw TypeError();
				}
			}

			while (i < len) {
				if (i in this) {
					result = cb.call(context, result, this[i], i, this);
				}

				i++;
			}

			return result;
		}
	}

	/**
	 * 递归,当前只能处理数字
	 */
	if (!Array.prototype.reduceRight) {
		Array.prototype.reduceRight = function(cb, init, context) {
			var result = init || 0;

			var len = this.length, i = len - 1
			for (; i > -1; i--) {
				if (i in this) {
					result = cb.call(context, this[i], result);
				}
			}

			return result;
		}
	}

	/**
	 * 判断元素在Array中的索引
	 * 
	 * @param {Object} item 目标对象
	 * @param {Integer} from 起始查询位置
	 * @returns {Integer} 对象在Array中的序号，第一位为0，如果没在Array中则结果为-1
	 */
	if (!Array.prototype.indexOf) {
		Array.prototype.indexOf = function(item, from) {
			var len = this.length;
			var i = from || 0;
			if (i < 0) {
				i += len;
			}

			for (; i < len; i++) {
				if (i in this && this[i] === item) {
					return i;
				}
			}
			return -1;
		}
	}

	/**
	 * 判断元素在Array中的索引,从尾部开始
	 * 
	 * @param {Object} item 目标对象
	 * @param {Integer} from 起始查询位置
	 * @returns {Integer} 对象在Array中的序号，第一位为0，如果没在Array中则结果为-1
	 */
	if (!Array.prototype.lastIndexOf) {
		Array.prototype.lastIndexOf = function(item, from) {
			var len = this.length;
			var i = from || len - 1;
			if (i < 0) {
				i += len;
			}
			for (; i > -1; i--) {
				if (i in this && this[i] === item) {
					return i;
				}
			}
			return -1;
		}
	}
}());